IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='spPresupuestoAnualEn3Fases_Update' and XTYPE='P')
BEGIN
	DROP PROCEDURE [dbo].[spPresupuestoAnualEn3Fases_Update]
END
GO
CREATE PROCEDURE [dbo].[spPresupuestoAnualEn3Fases_Update]
	 @OP VARCHAR(64)=NULL
	,@ParamAuxiliar NVARCHAR(MAX)=NULL  /* PARAMETRO AUXILIAR */
	,@Id INT=NULL
	,@CodPresupuesto VARCHAR(16)=NULL
	,@CodRubro VARCHAR(16)=NULL
	,@ValorPPTOCotecmar DECIMAL(18,2)=NULL
	,@ValorPPTOSaldosPCTMAR DECIMAL(18,2)=NULL
	,@ValorPPTOSaldosVPCTMAR DECIMAL(18,2)=NULL
	,@ValorPPTOPyG DECIMAL(18,2)=NULL
	,@ValorPPTOInterno DECIMAL(18,2)=NULL
	,@FechaCreacion DATETIME=NULL
	,@Usuario VARCHAR(32)=NULL
	,@ValorPPTOCotecmar_actual DECIMAL(18,2)=NULL
	,@ValorPPTOSaldosPCTMAR_actual DECIMAL(18,2)=NULL
	,@ValorPPTOSaldosVPCTMAR_actual DECIMAL(18,2)=NULL
	,@ValorPPTOPyG_actual DECIMAL(18,2)=NULL
	,@ValorPPTOInterno_actual DECIMAL(18,2)=NULL	
WITH ENCRYPTION
AS
SET NOCOUNT ON
BEGIN TRY

DECLARE @AUX VARCHAR(2048)

/*****     OPERACION POR DEFECTO    *****/
IF @OP IS NULL OR @OP = ''
BEGIN
	
	IF EXISTS (SELECT * FROM [PresupuestoAnualCabecera] WHERE CodPresupuesto=@CodPresupuesto AND Publicado=1)
	BEGIN
		SET @AUX='El presupuesto con codigo '+@CodPresupuesto+' ya se encuentra publicado.'+CHAR(10)+'No puede ser modificado.'
		RAISERROR(@AUX,16,1);
		RETURN 1
	END
	
	-- Verifico que el valor del presupuesto Interno ([ValorPPTOCotecmar]-[ValorPPTOSaldosPCTMAR]-[ValorPPTOSaldosVPCTMAR]) no sea MENOR que el que se haya definido en el detalle del presupuesto
	IF (@ValorPPTOInterno)<ISNULL((SELECT SUM(ValorActualPresupuesto) FROM PresupuestoAnualDetalle WHERE CodPresupuesto=@CodPresupuesto AND CodRubro=@CodRubro),0)
	BEGIN
		SET @AUX=dbo.fnFormatoMoneda(ISNULL((SELECT SUM(ValorActualPresupuesto) FROM PresupuestoAnualDetalle WHERE CodPresupuesto=@CodPresupuesto AND CodRubro=@CodRubro),0));
		SELECT @AUX='El Presupuesto Interno Correspondiente al Rubro '+@CodRubro+' No puede ser menor a $'+@AUX+'. Verifique!'
		RAISERROR(@AUX,16,1)
		RETURN 1		
	END

	BEGIN TRANSACTION
	UPDATE [dbo].[PresupuestoAnualEn3Fases] SET
		 [CodPresupuesto]=@CodPresupuesto
		,[CodRubro]=@CodRubro
		,[ValorPPTOCotecmar]=@ValorPPTOCotecmar
		,[ValorPPTOSaldosPCTMAR]=@ValorPPTOSaldosPCTMAR
		,[ValorPPTOSaldosVPCTMAR]=@ValorPPTOSaldosVPCTMAR
		,[ValorPPTOPyG]=@ValorPPTOPyG
		,[ValorPPTOInterno]=@ValorPPTOInterno
		,[ValorPPTOCotecmar_actual]=@ValorPPTOCotecmar_actual
		,[ValorPPTOSaldosPCTMAR_actual]=@ValorPPTOSaldosPCTMAR_actual
		,[ValorPPTOSaldosVPCTMAR_actual]=@ValorPPTOSaldosVPCTMAR_actual
		,[ValorPPTOPyG_actual]=@ValorPPTOPyG_actual
		,[ValorPPTOInterno_actual]=@ValorPPTOInterno_actual
		--,[FechaCreacion]=@FechaCreacion
		--,[Usuario]=@Usuario
	WHERE
		[Id]=@Id
	COMMIT TRANSACTION
	RETURN 0
END

--- Si se llega a este punto es porque el @OP indicado no Existe en el Procedimiento Almacenado
IF @OP IS NOT NULL
	BEGIN
	SET @ParamAuxiliar='La Operacion "'+@OP+'" No esta definida en el Procedimiento almacenado "'+OBJECT_NAME(@@PROCID)+'", Revise!.'
	RAISERROR(@ParamAuxiliar,16,1)
	RETURN 1
END

--- CONTROLAR Y REGISTRAR LOS ERRORES
END TRY
BEGIN CATCH
	--- Recopilo la informacion del error
	DECLARE @ERROR_NUMBER INT=ERROR_NUMBER(),@ERROR_SEVERITY INT=ERROR_SEVERITY(),@ERROR_STATE INT=ERROR_STATE(),@ERROR_PROCEDURE VARCHAR(128)=ERROR_PROCEDURE(),@ERROR_LINE INT=ERROR_LINE(),@ERROR_MESSAGE VARCHAR(2048)=ERROR_MESSAGE()
	--- Si hay transacciones abiertas, hago un rollback, SE ENCIERRA EN UN (TRY-CATCH) PARA QUE NO SE MUESTRE EL ERROR: Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT
	IF(@@TRANCOUNT>0) BEGIN BEGIN TRY ROLLBACK TRANSACTION END TRY BEGIN CATCH END CATCH END
	--- Ejecuto el SP que controla y registra el error
	EXEC [spSeguridadMessageException] @OP='MostrarMensaje',@ERROR_NUMBER=@ERROR_NUMBER,@ERROR_SEVERITY=@ERROR_SEVERITY,@ERROR_STATE=@ERROR_STATE,@ERROR_PROCEDURE=@ERROR_PROCEDURE,@ERROR_LINE=@ERROR_LINE,@ERROR_MESSAGE=@ERROR_MESSAGE
	RETURN 1
END CATCH;
